home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / lists / mint / l_1199 / 1751 < prev    next >
Encoding:
Internet Message Format  |  1994-08-27  |  4.9 KB

  1. Subject: Psigintr, sorry for the delay
  2. Date: Fri, 22 Jul 1994 15:36:41 -0700
  3. From: Howard Chu <hyc@hanauma.jpl.nasa.gov>
  4.  
  5. Sorry it took so long to get this tiny patch re-sent. This is relative to the
  6. h7 patch just sent out.
  7.  
  8. --- dos.c.O    Fri Jul 22 15:15:40 1994
  9. +++ dos.c    Fri Jul 22 15:24:44 1994
  10. @@ -707,6 +707,7 @@
  11.      dos_tab[0x13b] = d_getcwd;
  12.      dos_tab[0x13c] = s_alert;
  13.      dos_tab[0x13d] = t_malarm;
  14. +    dos_tab[0x13e] = p_sigintr;
  15.      dos_tab[0x13f] = s_uptime;
  16.      dos_tab[0x142] = d_xreaddir;
  17.      dos_tab[0x143] = p_seteuid;
  18. --- dosmem.c.O    Fri Jul 22 15:15:52 1994
  19. +++ dosmem.c    Fri Jul 22 15:27:22 1994
  20. @@ -770,6 +770,8 @@
  21.          FATAL("attempt to terminate MiNT");
  22.      }
  23.  
  24. +/* cancel all user-specified interrupt signals */
  25. +    cancelsigintrs();
  26.  /* cancel all pending timeouts for this process */
  27.      cancelalltimeouts();
  28.  /* cancel alarm clock */
  29. --- dossig.c.O    Tue Aug 17 01:30:28 1993
  30. +++ dossig.c    Fri Jul 22 15:19:02 1994
  31. @@ -210,3 +210,113 @@
  32.      TRACE(("Psigpause: returning OK"));
  33.      return 0;
  34.  }
  35. +
  36. +/*
  37. + * p_sigintr: Set an exception vector to send us the specified signal.
  38. + */
  39. +
  40. +typedef struct usig {
  41. +    int vec;        /* exception vector number */
  42. +    int sig;        /* signal to send */
  43. +    PROC *proc;        /* process to get signal */
  44. +    long oldv;        /* old exception vector value */
  45. +    struct usig *next;    /* next entry ... */
  46. +} usig;
  47. +
  48. +static usig *usiglst;
  49. +extern long mcpu;
  50. +
  51. +long ARGS_ON_STACK
  52. +p_sigintr(vec, sig)
  53. +    int vec;
  54. +    int sig;
  55. +{
  56. +    extern void new_intr();    /* in intr.spp */
  57. +    long vec2;
  58. +    usig *new;
  59. +
  60. +    if (!sig)        /* ignore signal 0 */
  61. +        return 0;
  62. +
  63. +    vec2 = (long) new_intr;
  64. +
  65. +#ifndef ONLY030
  66. +    if (mcpu == 0)            
  67. +        /* put vector number in high byte of vector address */
  68. +        vec2 |= ((long) vec) << 24;
  69. +#endif
  70. +    new = kmalloc(sizeof(usig));
  71. +    if (!new)            /* hope this never happens...! */
  72. +        return ENSMEM;
  73. +    new->vec = vec;
  74. +    new->sig = sig;
  75. +    new->proc = curproc;
  76. +    new->next = usiglst;        /* simple unsorted list... */
  77. +    usiglst = new;
  78. +
  79. +    new->oldv = setexc(vec, vec2);
  80. +    return new->oldv;
  81. +}
  82. +
  83. +/*
  84. + * Find the process that requested this interrupt, and send it a signal.
  85. + * Called at interrupt time by new_intr() from intr.spp, with interrupt
  86. + * vector number on the stack.
  87. + */
  88. +
  89. +void ARGS_ON_STACK
  90. +sig_user(vec)
  91. +    int vec;
  92. +{
  93. +    usig *ptr;
  94. +
  95. +    for (ptr = usiglst; ptr; ptr=ptr->next)
  96. +        if (vec == ptr->vec) {
  97. +            if (ptr->proc->wait_q != ZOMBIE_Q &&
  98. +                ptr->proc->wait_q != TSR_Q) {
  99. +                post_sig(ptr->proc, ptr->sig);
  100. +            }
  101. +#if 0    /* Search entire list, to allow multiple processes to respond to
  102. +       the same interrupt. (Why/when would you want that?) */
  103. +            break;
  104. +#endif
  105. +        }
  106. +    /*
  107. +     * Clear in-service bit for ST MFP interrupts
  108. +     */
  109. +    if (vec >= 64 && vec < 80) {
  110. +        char *mfp, c;
  111. +
  112. +        if (vec < 72)        /* Register B */
  113. +            mfp = (char *)0xfffffa11L;
  114. +        else            /* Register A */
  115. +            mfp = (char *)0xfffffa0fL;
  116. +        c = 1 << (vec & 7);
  117. +
  118. +        *mfp = ~c;
  119. +    }
  120. +}
  121. +
  122. +/*
  123. + * cancelsigintrs: remove any interrupts requested by this process, called
  124. + * at process termination.
  125. + */
  126. +void ARGS_ON_STACK
  127. +cancelsigintrs()
  128. +{
  129. +    usig *ptr, **old, *nxt;
  130. +    short s = spl7();
  131. +
  132. +    for (old=&usiglst, ptr=usiglst; ptr; ) {
  133. +        nxt = ptr->next;
  134. +        if (ptr->proc == curproc) {
  135. +            setexc(ptr->vec, ptr->oldv);
  136. +            *old = nxt;
  137. +            kfree(ptr);
  138. +        } else {
  139. +            old = &(ptr->next);
  140. +        }
  141. +        ptr = nxt;
  142. +    }
  143. +    spl(s);
  144. +}
  145. --- intr.spp.O    Fri Jul 22 15:16:02 1994
  146. +++ intr.spp    Fri Jul 22 15:32:40 1994
  147. @@ -76,7 +76,7 @@
  148.  %endif
  149.      clr.w    -(sp)            ; yes, long frames: push a frame word
  150.  L_short1:
  151. -    pea    L_comeback        ; push fake PC
  152. +    pea    L_comeback(pc)        ; push fake PC
  153.      move.w    sr,-(sp)        ; push status register
  154.      move.l    _old_vbl+8,-(sp)    ; go service the interrupt
  155.      rts
  156. @@ -231,7 +231,37 @@
  157.      move.l    _old_ikbd+8,-(sp)
  158.      rts            ; jump to system interrupt routine
  159.  
  160. +; Generic routine for handling any user-specified interrupts. On 68000, the
  161. +; vector number is stored in the high byte of the program counter.
  162.  ;
  163. +    XDEF    _new_intr
  164. +
  165. +_new_intr:
  166. +    movem.l    d0-d2/a0-a2,-(sp)    ; save regs
  167. +
  168. +%ifndef ONLY030
  169. +    tst.w    ($59e.w)    ; is frame format on stack?
  170. +    bne.s    nvec        ; yes, go use it
  171. +    bsr.s    ndummy        ; push PC to stack
  172. +    nop
  173. +ndummy:    
  174. +    move.w    (sp)+,d0    ; pop hi(PC) to d0
  175. +    addq.w    #2,sp        ; pop lo(PC) off stack
  176. +    lsr.w    #8,d0        ; move hi byte to vector number
  177. +    bra.s    ngot        ; continue
  178. +nvec:
  179. +%endif
  180. +    move.w    30(sp),d0    ; get frame word
  181. +    lsr.w    #2,d0        ; move vector offset to vector number
  182. +ngot:
  183. +    move.w    d0,-(sp)    ; push vector offset
  184. +    jsr    _sig_user    ; send signal
  185. +    addq.w    #2,sp            ; pop vector offset
  186. +    movem.l    (sp)+,d0-d2/a0-a2    ; restore regs
  187. +    rte
  188. +
  189. +
  190. +;
  191.  ; simple signal handlers
  192.  ; global variables referenced:
  193.  ; in_kernel: (main.c): flag to indicate that we're in the MiNT kernel
  194. --- proto.h.O    Fri Jul 22 15:16:42 1994
  195. +++ proto.h    Fri Jul 22 15:19:04 1994
  196. @@ -166,6 +166,8 @@
  197.  long ARGS_ON_STACK p_vfork P_((void));
  198.  long ARGS_ON_STACK p_fork P_((void));
  199.  
  200. +long ARGS_ON_STACK p_sigintr P_((int vec, int sig));
  201. +void cancelsigintrs P_((void));
  202.  /* dossig.c */
  203.  long ARGS_ON_STACK p_kill P_((int pid, int sig));
  204.  long ARGS_ON_STACK p_sigaction P_((int sig, const struct sigaction *act,
  205.